/*
云游戏协议消息构造器
负责构造各种云游戏协议消息，包括游戏启动、心跳、退出等
主要功能：
1. 游戏启动请求消息构造
2. 心跳消息构造
3. 游戏退出消息构造
4. 预启动参数编码
*/
package service

import (
	"encoding/base64"
	"time"

	"github.com/golang/protobuf/proto"
	cgapi "gitlab.vrviu.com/cloudgame_backend/access-public/grpc/com_pb"
	"gitlab.vrviu.com/inviu/backend-go-public/gopublic"
)

// getCGReqLaunchGame 获取云游戏启动请求消息
// 构造游戏启动所需的protobuf消息，包含游戏配置和流媒体参数
// 返回: *cgapi.CGReqLaunchGame - 游戏启动请求消息
func (client *AreaClient) getCGReqLaunchGame() *cgapi.CGReqLaunchGame {
	return &cgapi.CGReqLaunchGame{
		// 通用请求头，包含请求ID、时间戳和认证Token
		Header: &cgapi.CommonHeader{
			RequestId: gopublic.GenerateRandonString(8), // 随机生成8位请求ID
			Timestamp: uint64(time.Now().Unix()),        // 当前时间戳
			Token:     client.Atoken,                    // 区域访问Token
		},
		GameId:       client.Gid, // 游戏ID
		ResourceType: 1,          // 资源类型（1表示标准资源）
		// 流媒体配置信息（JSON格式字符串）
		// 包含：视频编码参数、摄像头配置、网络配置、客户端信息等
		StreamInfo: "{\"avgBitrateratio\":100,\"cameraInfo\":{\"cameraBitrate\":850,\"cameraFps\":24,\"cameraHeight\":480,\"cameraId\":1,\"cameraLevel\":1,\"cameraWidth\":640},\"clientNetworkType\":40,\"clientSupportHevc\":0,\"clientType\":\"web-pc\",\"connectionType\":\"webrtcVideo\",\"desiredHeight\":1080,\"desiredWidth\":1920,\"dev_identity\":\"\",\"forceAudioDataChannel\":0,\"gid\":12882,\"idrPeriod\":60,\"imeType\":0,\"keyboardType\":0,\"maxFps\":30,\"packetSize\":768,\"policy\":\"{}\",\"requestUseServerCursorData\":true,\"supportVideoCodecProfiles\":[8,1],\"vibration\":true,\"videoDataType\":\"mp4.h264\",\"videoLevel\":3,\"withHWCursor\":false}",
	}
}

// getPrelaunchParam 获取预启动参数
// 将游戏启动请求消息序列化并进行Base64编码
// 返回: string - Base64编码的启动参数字符串
func (client *AreaClient) getPrelaunchParam() string {
	// 使用protobuf序列化游戏启动请求
	data, _ := proto.Marshal(client.getCGReqLaunchGame())
	// 进行Base64编码，便于HTTP传输
	return base64.StdEncoding.EncodeToString(data)
}

// getHeartBeat 获取心跳消息
// 构造用于维持连接的心跳protobuf消息
// 返回: *cgapi.CGReqHeartbeat - 心跳请求消息
func (client *AreaClient) getHeartBeat() *cgapi.CGReqHeartbeat {
	return &cgapi.CGReqHeartbeat{
		// 通用请求头
		Header: &cgapi.CommonHeader{
			RequestId: gopublic.GenerateRandonString(8), // 随机生成8位请求ID
			Timestamp: uint64(time.Now().Unix()),        // 当前时间戳
			Token:     client.Atoken,                    // 区域访问Token
		},
	}
}

// getExitGame 获取游戏退出消息
// 构造游戏退出所需的protobuf消息
// 返回: *cgapi.CGReqExitGame - 游戏退出请求消息
func (client *AreaClient) getExitGame() *cgapi.CGReqExitGame {
	return &cgapi.CGReqExitGame{
		// 通用请求头
		Header: &cgapi.CommonHeader{
			RequestId: gopublic.GenerateRandonString(8), // 随机生成8位请求ID
			Timestamp: uint64(time.Now().Unix()),        // 当前时间戳
			Token:     client.Atoken,                    // 区域访问Token
		},
		GameId: client.Gid, // 游戏ID
	}
}
